home *** CD-ROM | disk | FTP | other *** search
- {
- From: LOU DUCHEZ
- Subj: mouse Library
- }
-
- unit mouse;
- interface { "Global" declarations }
- var mouseexist, mousecursoron: boolean; { Is a mouse hooked up? / Is the }
- procedure mouseinit; { mouse cursor "on"? }
- procedure mouseon;
- procedure mouseoff;
- function mousex: word; { Note about coordinates: these }
- function mousey: word; { routines return values starting }
- function mouseleft: boolean; { at 0, not 1 (even in text mode). }
- function mousemiddle: boolean; { So for text mode, you may want }
- function mouseright: boolean; { to modify a bit ... }
- procedure setmousexy(newx, newy: word);
- procedure limitmouse(lox, loy, hix, hiy: word);
-
-
- implementation { internal workings }
- uses dos;
- var regs: registers; { Used for the "mouse" interrupts }
- xshift, yshift: byte; { Depending on your video mode, you }
- { may need to convert "mouse" }
- { coordinates to / from "video" }
- procedure calcshifts; { coordinates. It's a matter of }
- var tempregs: registers; { shifting left/right; xshift }
- begin { records how to shift the "X", }
- tempregs.ah := $0f; { and yshift records for the "Y". }
- intr($10, tempregs); { Procedure CalcShifts figures out }
- case tempregs.al of { what text mode you're in and how }
- 0, 1, 2, 3, 7: begin { much to shift by. It gets the }
- xshift := 3; { video mode w/interrupt $10/$0f; }
- yshift := 3; { modes 0, 1, 2, 3 and 7 are text }
- end; { modes. 4, 5, $0d and $13 are }
- 4, 5, $0d, $13: begin { 320 x 200 graphics modes. All }
- xshift := 1; { other graphics modes are okay }
- yshift := 0; { "as is", although come to think }
- end; { of it I had a CGA system when I }
- else begin { wrote this library and thus }
- xshift := 0; { couldn't text VGA modes ... }
- yshift := 0;
- end;
- end;
- end;
-
-
- procedure mouseinit; { Initializes mouse -- determines if }
- begin { one is present, then figures out the }
- regs.ax := $0000; { shifts, and initializes the "cursor" }
- intr($33, regs); { variable to "false". }
- mouseexist := (regs.ax = $FFFF);
- if mouseexist then calcshifts; { Called automatically on startup; you }
- mousecursoron := false; { should call it if you change video }
- end; { modes in the program. }
-
-
- procedure mouseon; { Turns cursor ON. }
- begin
- if mouseexist then begin { Note: you really should "pair" each }
- regs.ax := $0001; { "on" with an "off"; if you don't, }
- intr($33, regs); { the PC can get confused. }
- mousecursoron := true;
- end;
- end;
-
-
- procedure mouseoff; { Turns cursor OFF. Note: when writing }
- begin { to the screen, you typically want to }
- if mouseexist then begin { turn the cursor OFF: the PC isn't }
- regs.ax := $0002; { smart enough to say, "I'm writing a }
- intr($33, regs); { character right where the mouse }
- mousecursoron := false; { cursor is: better make it inverse }
- end; { video". So you need to shut it off. }
- end;
-
-
- function mousex: word; { Gets the current mouse column. }
- var tempword: word;
- begin
- if mouseexist then begin
- regs.ax := $0003;
- intr($33, regs);
- tempword := regs.cx;
- end
- else
- tempword := 0;
- mousex := tempword shr xshift; { one of those funky "shift" things }
- end;
-
- function mousey: word; { Gets the current mouse row. }
- var tempword: word;
- begin
- if mouseexist then begin
- regs.ax := $0003;
- intr($33, regs);
- tempword := regs.dx;
- end
- else
- tempword := 0;
- mousey := tempword shr yshift;
- end;
-
-
- function mouseleft: boolean; { Is the left button down? }
- var tempword: word;
- begin
- if mouseexist then begin
- regs.ax := $0003;
- intr($33, regs);
- tempword := regs.bx;
- end
- else
- tempword := 0;
- mouseleft := mouseexist and (1 and tempword = 1);
- end;
-
-
- function mousemiddle: boolean; { Is the middle button down? }
- var tempword: word;
- begin
- if mouseexist then begin
- regs.ax := $0003;
- intr($33, regs);
- tempword := regs.bx;
- end
- else
- tempword := 0;
- mousemiddle := mouseexist and (4 and tempword = 4);
- end;
-
-
- function mouseright: boolean; { Is the right button down? }
- var tempword: word;
- begin
- if mouseexist then begin
- regs.ax := $0003;
- intr($33, regs);
- tempword := regs.bx;
- end
- else
- tempword := 0;
- mouseright := mouseexist and (2 and tempword = 2);
- end;
-
-
- procedure setmousexy(newx, newy: word); { Position mouse cursor. }
- begin
- regs.ax := $0004;
- regs.cx := newx shl xshift; { Shifts to get it into "mouse" }
- regs.dx := newy shl yshift; { coordinates. }
- intr($33, regs);
- end;
-
-
- procedure limitmouse(lox, loy, hix, hiy: word); { Restrict mouse movements. }
- begin
- regs.ah := $0f;
- intr($10, regs);
- regs.ax := $0007;
- regs.cx := lox shl xshift;
- regs.dx := hix shl xshift;
- intr($33, regs);
- regs.ax := $0008;
- regs.cx := loy shl yshift;
- regs.dx := hiy shl yshift;
- intr($33, regs);
- end;
-
-
- begin { Startup code: initializes mouse and gets video mode. }
- mouseinit;
- end.